package com.colin.userservice.exception;

import com.colin.response.R;
import com.colin.response.RCM;
import com.colin.userservice.exception.sub.PasswordErrorException;
import com.colin.userservice.exception.sub.UserNotExistsException;
import com.colin.userservice.exception.sub.UsernameExistsException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLException;

/**
 * 当前微服务的全局异常处理类
 * <p>
 * 当前微服务所有抛出的运行期异常 都被被这个Spring Bean捕获到 并执行特定逻辑(自己编写的方法)
 * <p>
 * 如何去捕获指定异常
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandle {


    /**
     * 当前方法就是处理所有和注册相关异常的逻辑
     *
     * 处理了哪儿个异常 就相当于当前微服务如果因为这个异常 而返回错误的话
     * 会被这个处理方法 try catch掉 并代替原有的controller返回响应
     */
    @ExceptionHandler(RegisterException.class)
    public R<Boolean> registerExceptionHandle(RegisterException exception) {

        if (exception instanceof UsernameExistsException) {
            return R.error(RCM.USER_EXISTS);
        }

        return R.error(RCM.USER_REGISTER_ERROR);
    }

    @ExceptionHandler(AccessException.class)
    public R<Boolean> accessExceptionHandle(AccessException exception) {

        if (exception instanceof UserNotExistsException) {
            return R.error(RCM.USER_NOT_EXISTS);
        }

        if (exception instanceof PasswordErrorException) {
            return R.error(RCM.USER_PASSWORD_ERROR);
        }

        return R.error(RCM.USER_LOGIN_ERROR);
    }

    @ExceptionHandler(SQLException.class)
    public R<Boolean> sqlExceptionHandle() {
        return R.error(RCM.SQL_ERROR);
    }
}
